#include <stdio.h>
#include <omp.h>

void prn_info(int level) {
    #pragma omp masked
    printf("LV%d: nths_next=%d\n", level, omp_get_max_threads());
}

// run with OMP_NUM_THREADS="4,5,6" OMP_MAX_ACTIVE_LEVELS=3
int main(void) {
    // Case 1
    // nthreads-var: 4,5,6
    // max-active-levels-var: 3
    // Case 1
    #pragma omp parallel
    {
        prn_info(1);  // LV1: nths_next=5
        // nthreads-var: 5,6
        #pragma omp parallel
        {
            prn_info(2);  // LV2: nths_next=6
            // nthreads-var: 6
            #pragma omp parallel
            {
                prn_info(3);  // LV3: nths_next=6
                // nthreads-var: 6
            }
        }
    }

    // Case 2
    // nthreads-var: 4,5,6
    #pragma omp parallel num_threads(8)
    {
        prn_info(1);  // LV1: nths_next=5
        // nthreads-var: 5,6
        #pragma omp parallel
        {
            prn_info(2);  // LV2: nths_next=6
            // nthreads-var: 6
            #pragma omp parallel
            {
                prn_info(3);  // LV3: nths_next=6
                // nthreads-var: 6
            }
        }
    }

    // Case 3
    // nthreads-var: 4,5,6
    // #pragma omp parallel num_threads(8, 2)
    // {
    //     prn_info(1);  // LV1: nths_next=2
    //     // nthreads-var: 2
    //     #pragma omp parallel
    //     {
    //         prn_info(2);  // LV2: nths_next=2
    //         // nthreads-var: 2
    //         #pragma omp parallel
    //         {
    //             prn_info(3);  // LV3: nths_next=2
    //             // nthreads-var: 2
    //         }
    //     }
    // }

    return 0;
}